/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import pojos.Categoria;
import pojos.Descargas;
import pojos.ListWrapper;
import pojos.Pedido;
import pojos.Pojo;
import pojos.Producto;
import pojos.ProductoDetalle;
import pojos.TipoProducto;
import pojos.Usuario;

/**
 *
 * @author Miguel
 */
public class RespuestaDeserializer implements JsonDeserializer<Respuesta> {

    @Override
    public Respuesta deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Respuesta resp = null;
        JsonObject jsobj = json.getAsJsonObject();
        int tipo_pojos = jsobj.get("tipo_pojos").getAsInt();
        String mens = null;
        JsonElement jsmens = jsobj.get("mensaje");
        if (jsmens != null) {
            mens = jsmens.getAsString();
        }
        if (tipo_pojos == -1) {
            resp = new Respuesta(jsobj.get("resultado").getAsInt(), mens);
        } else {
            resp = obtenerRespuesta(jsobj, context);
        }
        return resp;
    }

    private Respuesta obtenerRespuesta(JsonObject jsobj, JsonDeserializationContext context) {
        JsonArray jsarr = jsobj.get("pojos").getAsJsonArray();
        int tipo_pojos = jsobj.get("tipo_pojos").getAsInt();
        Pojo[] pojos = null;
        switch (tipo_pojos) {
            case Query.USUARIO_ARRAY:
                pojos = context.deserialize(jsarr, Usuario[].class);
                break;
            case Query.PRODUCTO_ARRAY:
                pojos = context.deserialize(jsarr, Producto[].class);
                break;
            case Query.CATEGORIA_ARRAY:
                pojos = context.deserialize(jsarr, Categoria[].class);
                break;
            case Query.DESCARGA_ARRAY:
                pojos = context.deserialize(jsarr, Descargas[].class);
                break;
            case Query.PEDIDO_ARRAY:
                pojos = context.deserialize(jsarr, Pedido[].class);
                break;
            case Query.PRODUCTODETALLE_ARRAY:
                pojos = context.deserialize(jsarr, ProductoDetalle[].class);
                break;
            case Query.TIPOPRODUCTO_ARRAY:
                pojos = context.deserialize(jsarr, TipoProducto[].class);
                break;
            case Query.GENERIC_LIST:
                pojos = context.deserialize(jsarr, ListWrapper[].class);
                break;
        }
        
        return new Respuesta(jsobj.get("resultado").getAsInt(), tipo_pojos, pojos);
    }
}
